#!/bin/bash
#
# Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

# This script is not to be run as stand-alone, it should be included from
# compare.sh.

##########################################################################################
# Check that we are run via inclusion from compare.sh and not as stand-alone.
if [ -z "$COMPARE_EXCEPTIONS_INCLUDE" ]; then
    echo "Error: This script should not be run as stand-alone. It is included by compare.sh"
    exit 1
fi

##########################################################################################
# Diff exceptions

if [ "$OPENJDK_TARGET_OS" = "linux" ]; then

  STRIP_BEFORE_COMPARE="
      "

  ACCEPTED_BIN_DIFF="
      ./lib/client/libjsig.so
      ./lib/client/libjvm.so
      ./lib/libattach.so
      ./lib/libdt_socket.so
      ./lib/libinstrument.so
      ./lib/libjsdt.so
      ./lib/libjsig.so
      ./lib/libmanagement.so
      ./lib/libnet.so
      ./lib/libnpt.so
      ./lib/libverify.so
      ./lib/minimal/libjsig.so
      ./lib/minimal/libjvm.so
      ./lib/server/libjsig.so
      ./lib/server/libjvm.so
      ./bin/idlj
      ./bin/jar
      ./bin/jarsigner
      ./bin/java
      ./bin/javac
      ./bin/javadoc
      ./bin/javap
      ./bin/jdeps
      ./bin/jcmd
      ./bin/jconsole
      ./bin/jdb
      ./bin/jhsdb
      ./bin/jimage
      ./bin/jinfo
      ./bin/jjs
      ./bin/jlink
      ./bin/jmap
      ./bin/jmod
      ./bin/jps
      ./bin/jrunscript
      ./bin/jsadebugd
      ./bin/jshell
      ./bin/jstack
      ./bin/jstat
      ./bin/jstatd
      ./bin/keytool
      ./bin/orbd
      ./bin/pack200
      ./bin/rmic
      ./bin/rmid
      ./bin/rmiregistry
      ./bin/schemagen
      ./bin/serialver
      ./bin/servertool
      ./bin/tnameserv
      ./bin/wsgen
      ./bin/wsimport
      ./bin/xjc
      "

  if [ "$OPENJDK_TARGET_CPU" = "arm" ]; then
    # NOTE: When comparing the old and new hotspot builds, the link time
    # optimization makes good comparisons impossible. Fulldump compare always
    # fails and disassembly can end up with some functions in different order.
    # So for now, accept the difference but put a limit on the size. The
    # different order of functions shouldn't result in a very big diff.
    KNOWN_FULLDUMP_DIFF="
        ./lib/minimal/libjvm.so
        "

    # Link time optimization adds random numbers to symbol names
    NEED_DIS_DIFF_FILTER="
        ./lib/minimal/libjvm.so
        "
    DIS_DIFF_FILTER="$SED -r \
        -e 's/\.[0-9]+/.X/g' \
        -e 's/\t[0-9a-f]{4} [0-9a-f]{4} /\tXXXX XXXX /' \
        -e 's/\t[0-9a-f]{5,} /\t<HEX> /' \
        "
    KNOWN_DIS_DIFF="
        ./lib/minimal/libjvm.so
        "
    MAX_KNOWN_DIS_DIFF_SIZE="3000"

    NEED_SYMBOLS_DIFF_FILTER="
        ./lib/minimal/libjvm.so
        "
    SYMBOLS_DIFF_FILTER="$SED -r \
        -e 's/\.[0-9]+/.X/g'
        "
  fi
fi

if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then

  STRIP_BEFORE_COMPARE="
      "

  SORT_SYMBOLS="
      ./lib/server/libjvm.so
      ./lib/libfontmanager.so
      ./lib/libjimage.so
      ./lib/libsaproc.so
      ./lib/libunpack.so
      ./bin/unpack200
      "

  SKIP_BIN_DIFF="true"

  ACCEPTED_SMALL_SIZE_DIFF="
      ./lib/jli/libjli.so
      ./lib/jspawnhelper
      ./lib/libJdbcOdbc.so
      ./lib/libattach.so
      ./lib/libawt.so
      ./lib/libawt_headless.so
      ./lib/libawt_xawt.so
      ./lib/libdcpr.so
      ./lib/libdt_socket.so
      ./lib/libfontmanager.so
      ./lib/libinstrument.so
      ./lib/libj2gss.so
      ./lib/libj2pcsc.so
      ./lib/libj2pkcs11.so
      ./lib/libj2ucrypto.so
      ./lib/libjaas_unix.so
      ./lib/libjava.so
      ./lib/libjawt.so
      ./lib/libjdwp.so
      ./lib/libjpeg.so
      ./lib/libjsdt.so
      ./lib/libjsound.so
      ./lib/libkcms.so
      ./lib/liblcms.so
      ./lib/libmanagement.so
      ./lib/libmlib_image.so
      ./lib/libnet.so
      ./lib/libnio.so
      ./lib/libnpt.so
      ./lib/libsctp.so
      ./lib/libsplashscreen.so
      ./lib/libsunec.so
      ./lib/libsunwjdga.so
      ./lib/libunpack.so
      ./lib/libverify.so
      ./lib/libzip.so
      ./lib/server/64/libjvm_db.so
      ./lib/server/64/libjvm_dtrace.so
      ./lib/server/libjvm.so
      ./lib/server/libjvm_db.so
      ./lib/server/libjvm_dtrace.so
      ./bin/idlj
      ./bin/jar
      ./bin/jarsigner
      ./bin/java
      ./bin/javac
      ./bin/javadoc
      ./bin/javap
      ./bin/jdeps
      ./bin/jcmd
      ./bin/jconsole
      ./bin/jdb
      ./bin/jimage
      ./bin/jinfo
      ./bin/jjs
      ./bin/jlink
      ./bin/jmap
      ./bin/jmod
      ./bin/jps
      ./bin/jrunscript
      ./bin/jsadebugd
      ./bin/jstack
      ./bin/jstat
      ./bin/jstatd
      ./bin/keytool
      ./bin/orbd
      ./bin/pack200
      ./bin/rmic
      ./bin/rmid
      ./bin/rmiregistry
      ./bin/schemagen
      ./bin/serialver
      ./bin/servertool
      ./bin/tnameserv
      ./bin/unpack200
      ./bin/wsgen
      ./bin/wsimport
      ./bin/xjc
      "

  SKIP_FULLDUMP_DIFF="true"

  # Random strings looking like this differ: <.XAKoKoPIac2W0OA.
  DIS_DIFF_FILTER="$SED \
      -e 's/<\.[A-Za-z0-9]\{\15}\./<.SYM./' \
      "

fi

if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "sparcv9" ]; then

  STRIP_BEFORE_COMPARE="
      "

  SORT_SYMBOLS="
      ./lib/libjsig.so
      ./lib/libfontmanager.so
      ./lib/libjimage.so
      ./lib/libsaproc.so
      ./lib/libunpack.so
      ./lib/server/libjvm.so
      ./lib/server/libjvm_dtrace.so
      ./bin/unpack200
      "

  SKIP_BIN_DIFF="true"

  ACCEPTED_SMALL_SIZE_DIFF="
      ./lib/client/libjvm.so
      ./lib/jli/libjli.so
      ./lib/jspawnhelper
      ./lib/libJdbcOdbc.so
      ./lib/libattach.so
      ./lib/libawt.so
      ./lib/libawt_headless.so
      ./lib/libawt_xawt.so
      ./lib/libdcpr.so
      ./lib/libdt_socket.so
      ./lib/libfontmanager.so
      ./lib/libinstrument.so
      ./lib/libj2gss.so
      ./lib/libj2pcsc.so
      ./lib/libj2pkcs11.so
      ./lib/libj2ucrypto.so
      ./lib/libjaas_unix.so
      ./lib/libjava.so
      ./lib/libjawt.so
      ./lib/libjdwp.so
      ./lib/libjpeg.so
      ./lib/libjsdt.so
      ./lib/libjsound.so
      ./lib/libkcms.so
      ./lib/liblcms.so
      ./lib/libmanagement.so
      ./lib/libmlib_image.so
      ./lib/libmlib_image_v.so
      ./lib/libnet.so
      ./lib/libnio.so
      ./lib/libnpt.so
      ./lib/libsctp.so
      ./lib/libsplashscreen.so
      ./lib/libsunec.so
      ./lib/libsunwjdga.so
      ./lib/libunpack.so
      ./lib/libverify.so
      ./lib/libzip.so
      ./lib/server/libjvm.so
      ./bin/idlj
      ./bin/jar
      ./bin/jarsigner
      ./bin/java
      ./bin/javac
      ./bin/javadoc
      ./bin/javap
      ./bin/jdeps
      ./bin/jcmd
      ./bin/jconsole
      ./bin/jdb
      ./bin/jimage
      ./bin/jinfo
      ./bin/jjs
      ./bin/jlink
      ./bin/jmap
      ./bin/jmod
      ./bin/jps
      ./bin/jrunscript
      ./bin/jsadebugd
      ./bin/jstack
      ./bin/jstat
      ./bin/jstatd
      ./bin/keytool
      ./bin/orbd
      ./bin/pack200
      ./bin/rmic
      ./bin/rmid
      ./bin/rmiregistry
      ./bin/schemagen
      ./bin/serialver
      ./bin/servertool
      ./bin/tnameserv
      ./bin/unpack200
      ./bin/wsgen
      ./bin/wsimport
      ./bin/xjc
      "

  DIS_DIFF_FILTER="$SED \
      -e 's/^[0-9a-f]\{16\}/<ADDR>:/' \
      -e 's/^ *[0-9a-f]\{3,12\}:/  <ADDR>:/' \
      -e 's/:	[0-9a-f][0-9a-f]\( [0-9a-f][0-9a-f]\)\{2,10\}/:	<NUMS>/' \
      -e 's/\$[a-zA-Z0-9_\$]\{15\}\./<SYM>./' \
      -e 's/, [0-9a-fx\-]\{1,8\}/, <ADDR>/g' \
      -e 's/0x[0-9a-f]\{1,8\}/<HEX>/g' \
      -e 's/\! [0-9a-f]\{1,8\} /! <ADDR> /' \
      -e 's/call  [0-9a-f]\{4,7\}/call  <ADDR>/' \
      -e 's/%hi(0),/%hi(<HEX>),/' \
      "

  KNOWN_DIS_DIFF="
      ./lib/libsaproc.so
  "

  MAX_KNOWN_DIS_DIFF_SIZE="3000"

  # On slowdebug the disassembly can differ randomly.
  if [ "$DEBUG_LEVEL" = "slowdebug" ]; then
    ACCEPTED_DIS_DIFF="
        ./lib/libfontmanager.so
        ./lib/server/libjvm.so
    "
  fi

  SKIP_FULLDUMP_DIFF="true"

fi


if [ "$OPENJDK_TARGET_OS" = "windows" ]; then

  ACCEPTED_JARZIP_CONTENTS="
      /modules_libs/java.security.jgss/w2k_lsa_auth.diz
      /modules_libs/java.security.jgss/w2k_lsa_auth.pdb
      /modules_libs/java.security.jgss/w2k_lsa_auth.map
      /modules_libs/java.security.jgss/w2k_lsa_auth.dll
      "

  # Probably should add all libs here
  ACCEPTED_SMALL_SIZE_DIFF="
      ./bin/attach.dll
      ./bin/jsoundds.dll
      ./bin/client/jvm.dll
      ./bin/server/jvm.dll
      ./bin/idlj.exe
      ./bin/jar.exe
      ./bin/jarsigner.exe
      ./bin/java-rmi.exe
      ./bin/java.exe
      ./bin/javac.exe
      ./bin/javadoc.exe
      ./bin/javap.exe
      ./bin/jdeps.exe
      ./bin/javaw.exe
      ./bin/jcmd.exe
      ./bin/jconsole.exe
      ./bin/jdb.exe
      ./bin/jimage.exe
      ./bin/jinfo.exe
      ./bin/jjs.exe
      ./bin/jlink.exe
      ./bin/jmap.exe
      ./bin/jmod.exe
      ./bin/jps.exe
      ./bin/jrunscript.exe
      ./bin/jsadebugd.exe
      ./bin/jstack.exe
      ./bin/jstat.exe
      ./bin/jstatd.exe
      ./bin/keytool.exe
      ./bin/kinit.exe
      ./bin/klist.exe
      ./bin/ktab.exe
      ./bin/orbd.exe
      ./bin/pack200.exe
      ./bin/rmic.exe
      ./bin/rmid.exe
      ./bin/rmiregistry.exe
      ./bin/schemagen.exe
      ./bin/serialver.exe
      ./bin/servertool.exe
      ./bin/tnameserv.exe
      ./bin/unpack200.exe
      ./bin/wsgen.exe
      ./bin/wsimport.exe
      ./bin/xjc.exe
      "

  SORT_SYMBOLS="
      ./bin/fontmanager.dll
      "

  ACCEPTED_DIS_DIFF="
      ./bin/jabswitch.exe
      ./bin/fontmanager.dll
      "

  if [ "$OPENJDK_TARGET_CPU" = "x86" ]; then
    DIS_DIFF_FILTER="$SED -r \
        -e 's/^  [0-9A-F]{16}: //' \
        -e 's/^  [0-9A-F]{8}: /  <ADDR>: /' \
        -e 's/(offset \?\?)_C@_.*/\1<SYM>/' \
        -e 's/[@?][A-Za-z0-9_]{1,25}/<SYM>/' \
        -e 's/([-,+])[0-9A-F]{2,16}/\1<HEXSTR>/g' \
        -e 's/\[[0-9A-F]{4,16}h\]/[<HEXSTR>]/' \
        -e 's/: ([a-z]{2}[a-z ]{2})        [0-9A-F]{2,16}h?$/: \1        <HEXSTR>/' \
        -e 's/_20[0-9]{2}_[0-1][0-9]_[0-9]{2}/_<DATE>/' \
        "
  elif [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then
    DIS_DIFF_FILTER="$SED -r \
        -e 's/^  [0-9A-F]{16}: //' \
        -e 's/\[[0-9A-F]{4,16}h\]/[<HEXSTR>]/' \
        -e 's/([,+])[0-9A-F]{2,16}h/\1<HEXSTR>/' \
        -e 's/([a-z]{2}[a-z ]{2})        [0-9A-F]{4,16}$/\1        <HEXSTR>/' \
        -e 's/\[\?\?_C@_.*/[<SYM>]/' \
        "
  fi

  SKIP_BIN_DIFF="true"
  SKIP_FULLDUMP_DIFF="true"

  # NOTE: When comparing the old and new hotspot builds, the server jvm.dll
  # cannot be made equal in disassembly. Some functions just always end up
  # in different order. So for now, accept the difference but put a limit
  # on the size. The different order of functions shouldn't result in a very
  # big diff.
  KNOWN_DIS_DIFF="
      ./bin/server/jvm.dll
      "
  MAX_KNOWN_DIS_DIFF_SIZE="2000000"
fi


if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then

  ACCEPTED_JARZIP_CONTENTS="
      /META-INF/INDEX.LIST
      "

  ACCEPTED_BIN_DIFF="
      ./bin/idlj
      ./bin/jar
      ./bin/jarsigner
      ./bin/java
      ./bin/javac
      ./bin/javadoc
      ./bin/javap
      ./bin/javaws
      ./bin/jdeps
      ./bin/jcmd
      ./bin/jconsole
      ./bin/jdb
      ./bin/jimage
      ./bin/jinfo
      ./bin/jjs
      ./bin/jlink
      ./bin/jmap
      ./bin/jmod
      ./bin/jps
      ./bin/jrunscript
      ./bin/jsadebugd
      ./bin/jstack
      ./bin/jstat
      ./bin/jstatd
      ./bin/keytool
      ./bin/orbd
      ./bin/pack200
      ./bin/rmic
      ./bin/rmid
      ./bin/rmiregistry
      ./bin/schemagen
      ./bin/serialver
      ./bin/servertool
      ./bin/tnameserv
      ./bin/wsgen
      ./bin/wsimport
      ./bin/xjc
      ./Contents/Home/bin/_javaws
      ./Contents/Home/bin/javaws
      ./Contents/Home/bin/idlj
      ./Contents/Home/bin/servertool
      ./Contents/Home/lib/shortcuts/JavaWSApplicationStub
      ./Contents/Home/lib/jli/libjli.dylib
      ./Contents/Home/lib/jspawnhelper
      ./Contents/Home/lib/libAppleScriptEngine.dylib
      ./Contents/Home/lib/libattach.dylib
      ./Contents/Home/lib/libawt_lwawt.dylib
      ./Contents/Home/lib/libdeploy.dylib
      ./Contents/Home/lib/libdt_socket.dylib
      ./Contents/Home/lib/libinstrument.dylib
      ./Contents/Home/lib/libjdwp.dylib
      ./Contents/Home/lib/libjsdt.dylib
      ./Contents/Home/lib/libjsig.dylib
      ./Contents/Home/lib/libmanagement.dylib
      ./Contents/Home/lib/libnpjp2.dylib
      ./Contents/Home/lib/libosx.dylib
      ./Contents/Home/lib/libosxapp.dylib
      ./Contents/Home/lib/libosxui.dylib
      ./Contents/Home/lib/libverify.dylib
      ./Contents/Home/lib/libsaproc.dylib
      ./Contents/Home/lib/libsplashscreen.dylib
      ./Contents/Home/lib/server/libjsig.dylib
      ./Contents/Home/lib/server/libjvm.dylib
      ./Contents/Home/lib/deploy/JavaControlPanel.prefPane/Contents/MacOS/JavaControlPanel
      ./Contents/Resources/JavaControlPanelHelper
      ./Contents/Resources/JavaUpdater.app/Contents/MacOS/JavaUpdater
      ./Contents/Resources/JavawsLauncher.app/Contents/MacOS/JavawsLauncher
      ./lib/shortcuts/JavaWSApplicationStub
      ./lib/jli/libjli.dylib
      ./lib/jspawnhelper
      ./lib/libAppleScriptEngine.dylib
      ./lib/libattach.dylib
      ./lib/libawt_lwawt.dylib
      ./lib/libdeploy.dylib
      ./lib/libdt_socket.dylib
      ./lib/libinstrument.dylib
      ./lib/libjdwp.dylib
      ./lib/libjsdt.dylib
      ./lib/libjsig.dylib
      ./lib/libmanagement.dylib
      ./lib/libnpjp2.dylib
      ./lib/libosx.dylib
      ./lib/libosxapp.dylib
      ./lib/libosxui.dylib
      ./lib/libverify.dylib
      ./lib/libsaproc.dylib
      ./lib/libsplashscreen.dylib
      ./lib/server/libjsig.dylib
      ./lib/server/libjvm.dylib
      ./lib/deploy/JavaControlPanel.prefPane/Contents/MacOS/JavaControlPanel
      ./Versions/A/Resources/finish_installation.app/Contents/MacOS/finish_installation
      ./Versions/A/Sparkle
      "

  SORT_SYMBOLS="
      ./Contents/Home/lib/libsaproc.dylib
      ./lib/libsaproc.dylib
      ./lib/libjsig.dylib
      "

  ACCEPTED_SMALL_SIZE_DIFF="$ACCEPTED_BIN_DIFF"

  DIS_DIFF_FILTER="LANG=C $SED \
      -e 's/0x[0-9a-f]\{3,16\}/<HEXSTR>/g' -e 's/^[0-9a-f]\{12,20\}/<ADDR>/' \
      -e 's/-20[0-9][0-9]-[0-1][0-9]-[0-3][0-9]-[0-2][0-9]\{5\}/<DATE>/g' \
      -e 's/), built on .*/), <DATE>/' \
      "

fi
